if(APPLE)
    cmake_minimum_required(VERSION 3.0)
else()
    cmake_minimum_required(VERSION 2.8)
endif()

project(ngt)

file(STRINGS "VERSION" ngt_VERSION)
message(STATUS "VERSION: ${ngt_VERSION}")
string(REGEX MATCH "^[0-9]+" ngt_VERSION_MAJOR ${ngt_VERSION})

set(ngt_VERSION ${ngt_VERSION})
set(ngt_SOVERSION ${ngt_VERSION_MAJOR})

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release")
endif(NOT CMAKE_BUILD_TYPE)
string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER)
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "CMAKE_BUILD_TYPE_LOWER: ${CMAKE_BUILD_TYPE_LOWER}")

if(${NGT_SHARED_MEMORY_ALLOCATOR})
    set(NGT_QBG_DISABLED TRUE)
endif(${NGT_SHARED_MEMORY_ALLOCATOR})

if(${UNIX})
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)

    if(CMAKE_VERSION VERSION_LESS 3.1)
        set(BASE_OPTIONS "-Wall -std=gnu++0x -lrt")

        if(${NGT_AVX_DISABLED})
            message(STATUS "AVX will not be used to compute distances.")
        endif()

        if(${NGT_OPENMP_DISABLED})
            message(STATUS "OpenMP is disabled.")
        else()
            set(BASE_OPTIONS "${BASE_OPTIONS} -fopenmp")
        endif()

        if(${NGT_ASSERT_DISABLED})
            message(STATUS "assert() is disabled.")
            set(BASE_OPTIONS "${BASE_OPTIONS} -DNDEBUG")
        endif()

        set(CMAKE_CXX_FLAGS_DEBUG "-g ${BASE_OPTIONS}")

        if(${NGT_MARCH_NATIVE_DISABLED})
            message(STATUS "Compile option -march=native is disabled.")
            set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${BASE_OPTIONS}")
        else()
            set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native ${BASE_OPTIONS}")
        endif()
    else()
        if (CMAKE_BUILD_TYPE_LOWER STREQUAL "release")
            set(CMAKE_CXX_FLAGS_RELEASE "")
            if(${NGT_MARCH_NATIVE_DISABLED})
                message(STATUS "Compile option -march=native is disabled.")
                add_compile_options(-O2 -DNDEBUG)
            elseif(${NGT_AVX2})
                add_compile_options(-Ofast -march=haswell -DNDEBUG)
            elseif(${NGT_AVX_DISABLED})
                message(STATUS "AVX will not be used to compute distances.")
                add_compile_options(-Ofast -march=x86-64 -DNDEBUG)
            else()
                add_compile_options(-Ofast -march=native -DNDEBUG)
            endif()
        endif()
        add_compile_options(-Wall)
        if(${NGT_OPENMP_DISABLED})
            message(STATUS "OpenMP is disabled.")
        else()
            if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
                if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0")
                    message(FATAL_ERROR "Insufficient AppleClang version")
                endif()
                cmake_minimum_required(VERSION 3.16)
            endif()
            find_package(OpenMP REQUIRED)
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
        endif()
        set(CMAKE_CXX_STANDARD 11) # for std::unordered_set, std::unique_ptr
        set(CMAKE_CXX_STANDARD_REQUIRED ON)
	find_package(Threads REQUIRED)
        if(${NGT_QBG_DISABLED})
            message(STATUS "QBG is disabled.")
        else()
            find_package(BLAS REQUIRED)
            find_package(LAPACK REQUIRED)
        endif()
    endif()

    if(${NGT_BFLOAT_DISABLED})
        message(STATUS "bfloat is disabled.")
    endif()

    add_subdirectory("${PROJECT_SOURCE_DIR}/lib")
    add_subdirectory("${PROJECT_SOURCE_DIR}/bin")
    add_subdirectory("${PROJECT_SOURCE_DIR}/samples")
endif(${UNIX})
